package com.servicecloud.consumer.config;

import java.nio.charset.Charset;
import java.util.Base64;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.web.client.RestTemplate;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RetryRule;

@Configuration
public class ConfigBean {

	/**
	 * 使用restTemplate访问restful接口。 (url, requestMap, ResponseBean.class)这三个参数分别代表
	 * REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
	 */
	@Bean
	@LoadBalanced // Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。默认采用轮询算法进行负载均衡,加上这个注解后地址可以用微服务名字代替
	public RestTemplate getRestTemplate() {
		return new RestTemplate();
	}

	/**
	 * 作用：</br>
	 * 针对SpringSecurity进行的安全认证配置（他的认证是基于头信息进行认证处理的）
	 * 
	 * @Author Gavin</br>
	 * @return</br>
	 * 				2019年8月12日
	 */
	@Bean
	public HttpHeaders getHeaders() {
		HttpHeaders headers = new HttpHeaders();
		// String auth = "springcloud:hello";// springsecurity设置的账号密码,这儿设置的是微服务的认证信息
		String auth = "springcloudzuul:hello";// 配置的是zuul的访问安全信息
		byte[] encodeAuth = Base64.getEncoder().encode(auth.getBytes(Charset.forName("US-ASCII")));// 需要进行Base64加密
		String authHeader = "Basic " + new String(encodeAuth);// 需要注意Basic后面有一个空格
		headers.set("Authorization", authHeader);
		return headers;
	}

	/**
	 * 作用：</br>
	 * 自定义负载均衡规则，这儿自定义效果和新建{@code MySelfRule.class}然后在Application中指定这个类的效果一样
	 * 
	 * @Author Gavin</br>
	 * @return</br>
	 * 				2019年8月13日
	 */
	@Bean
	public IRule myRule() {
		// return new RandomRule();// 采用随机算法进行负载均衡，默认是采用轮询的方式
		return new RetryRule();// 采用轮询算法，如果服务连续多次无法访问就会跳过该服务的调用
	}
}